package _12_Object._01_Equals;
/**
 * 关于 Object 中的 equals 方法
 * 
 * public boolean equals (Object obj){
 * 		return (this == obj);
 * }
 * 
 * o1.equals(o2);
 * o1 == o2;
 * 
 * equals 设计目的 : 为了比较两个对象是否相等,是否是同一个对象
 * 但是 Object 中的 equals 方法,默认比较内存地址,需要我们根据自己的需求进行方法的重写
 * 
 * == 如果两边是引用数据类型,就会比较内存地址是否相等
 * 
 * 两个对象可以是任何东西,但是我们肯定要拿两个对象的有意义属性进行比较
 * 所以这个时候,我们需要将两个对象对应的 equals 方法进行重写,来满足我们的要求
 * 除非,你就想知道他们的内存地址是否一致
 * 
 * 不同类的对象的属性,没有可比性
 * 
 * @author lenovo
 * @Date 2020年7月10日
 * @Time 下午8:17:27
 */
public class Equals_01 {

	public static void main(String[] args) {
		Equals_01 e = new Equals_01();
		Student s1 = new Student(1, "张三");
		Student s2 = new Student(2, "李四");
		Student s3 = new Student(1, "张三");
		System.out.println(s1 == s3);
		System.out.println(s1.equals(s3));
		System.out.println(s1.equals(s2));
	}

}

class Student {
	int id;
	String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public boolean equals(Object obj) {
		// 如果内存地址一样,说明是同一个对象,就不用比了,哪哪都一样,直接返回true
		if (this == obj) {
			return true;
		}

		// 判断 obj 是否是当前类对象,如果不是,没有可比性,直接返回false
		if (obj instanceof Student) {
			// 能到这里就说明 obj 是 Student 类实例化而来
			// 向下转型,否则不会访问特有属性
			Student s = (Student) obj;
			// 根据需求做判断即可
			if (this.id == s.id && this.name.equals(s.name)) {
				return true;
			}
		}
		return false;
	}
}